雖然在Microsoft Orleans的官方說明中有提及一個PowerShell模組可用來撰寫PowerShell的script呼叫Grain的RPC方法來驗證Grain行為,但由於該模組在Orleans v3+以後就沒在維護,而且實際使用上也並不太靈活,今天的文章提供另一個方法,使用.NET Interactive Notebooks來驗證Grain的功能。
.NET Interactive是一個MIT授權的開源專案,它的目標是提供一個可以在瀏覽器中執行.NET程式碼的環境,並且可以與其他語言的程式碼互動。
目前提供配合 dotnet CLI的命令列工具延伸套件以便讓 .NET Interactive和資料探勘/人工智慧界常用的Jupyter整合,進而能在網頁介面的 Jupyter Notebook/JupyterLab上除了Python之外,還可以執行C#、F#、PowerShell、JavaScript、HTML、SQL等其他程式語言的程式碼。
如果不想要安裝Jupyter Notebook,.NET Interactive提供一個Visual Studio Code的擴充套件,讓開發者可以在Visual Studio Code中使用.NET Interactive。
接下來示範如何在Visual Studio Code中用.NET Interactive擴充套件提供的功能來驗證Orleans的Grain專案功能。
需要安裝的軟體有:
new notebook
以便篩選可用選項:.NET Interactive: Create new blank notebook
,然後按下 Enter。在Notebook檔案中,可以打程式碼按 Ctrl + Enter 執行程式的UI部分,以下簡稱『Code Cell』以方便進行說明。
#region install Nuget
//Essential libs for running .NET 6 Generic Host
#r "nuget: Microsoft.Extensions.Hosting"
#r "nuget: Microsoft.Extensions.DependencyInjection"
//Orleans essential dependencies
#r "nuget: Microsoft.Orleans.Core"
#r "nuget: Microsoft.Orleans.OrleansRuntime"
//Orleans silo server runtime essentials
#r "nuget: Microsoft.Orleans.Server"
#endregion
using Microsoft.Extensions.Hosting;
using Orleans;
using Orleans.Runtime;
using Orleans.Hosting;
#!pwsh
dotnet build ../src/Grains/RpcDemo.Grains.Greeting/RpcDemo.Grains.Greeting.csproj --nologo --verbosity quiet
那個#!pwsh
表示Code Cell中該標記之後的內容是使用PowerShell來解譯/執行的命令。#r "../src/Shared/RpcDemo.Interfaces.Hello/bin/Debug/netstandard2.0/RpcDemo.Interfaces.Hello.dll"
#r "../src/Grains/RpcDemo.Grains.Greeting/bin/Debug/net6.0/RpcDemo.Grains.Greeting.dll"
using RpcDemo.Grains.Greeting;
var hostBuilder = Host.CreateDefaultBuilder()
.UseOrleans(builder =>
{
builder.UseLocalhostClustering();
builder.ConfigureApplicationParts(parts => {
parts.AddApplicationPart(typeof(IHelloGrain).Assembly).WithReferences();
parts.AddApplicationPart(typeof(HelloGrain).Assembly).WithReferences();
});
})
Microsoft Orleans框架提供一個UseOrleans()
擴充方法來整合至ASP.NET Core的web服務框架/.NET Generic Host中執行Silo的服務實體,而餵給該方法的Lambda敘述式參數中,第一行UseLocalhostClustering()
設定Silo使用本機端測試叢集,第二行呼叫SiloBuilder
的ConfigureApplicationParts()
擴充方法來載入HelloGrain
實作類別的Assembly,並且使用另一個WithReferences()擴充方法來載入該Grain實作類別的程式中有用到的其他相依類別。Build()
建置方法來產生一個Generic Host實體,並且呼叫StartAsync()方法來啟動承載本機Silo測試叢集的.NET Generic Host服務實體:
var host = hostBuilder.Build();
await host.StartAsync();
ClientBuilder
程式碼:
var clientBuilder = new ClientBuilder().UseLocalhostClustering();
clientBuilder.ConfigureApplicationParts(parts=>parts.AddApplicationPart(typeof(IHelloGrain).Assembly)
與Server端類似,在Client端也有個UseLocalhostClustering()
擴充方法設定連結本機端測試叢集的Silo服務,然後也有相對應載入RPC介面的Assembly的機制。Build()
建置方法產生Orleans Client端物件:
var client = clientBuilder.Build();
await client.Connect();
var helloGrainRpc = client.GetGrain<IHelloGrain>(0);
var greeting = await helloGrainRpc.SayHello("Orleans");
display(greeting);
最後一行的 display()
是.NET Interactive Notebook C# Kernel的特殊函式可印出變數值,執行的結果如下圖所示:await client.Close();
StopAsync()
方法來關閉.NET Generic Host服務實體:
await host.StopAsync().ConfigureAwait(false);
以上是使用 .NET Interactive Notebook 來撰寫Orleans的範例,這個範例可直接從GitHub的預覽網頁上看到:
https://github.com/windperson/OrleansRpcDemo/blob/day07/notebooks/verify_HelloGrain.ipynb
明天我們來看看如何寫Orleans的Unit Test專案,來測試Grain實作專案的RPC呼叫。